package ar.edu.frba.utn.dds.Usuario;

import java.util.ArrayList;
import java.util.List;

import ar.edu.frba.utn.dds.Compania.Compania;
import ar.edu.frba.utn.dds.Expcetion.ConversionException;
import ar.edu.frba.utn.dds.Vuelo.Asiento;
import ar.edu.frba.utn.dds.Vuelo.ObtenerAsientos;
import ar.edu.frba.utn.dds.Vuelo.Viaje;

public class Usuario {
	private String nombre;
	private String apellido;
	private String DNI;
	private String tipoUsuario;
	private List<Busqueda> busquedas=new ArrayList<Busqueda>();
	private List<Asiento> asientosBusqueda;
	private Double montoCompras = 0.0;
	private Perfil perfil;
	private Boolean registroBusqueda = false;
	private ObtenerAsientos obtencionDeAsientos=new ObtenerAsientos();

	public Usuario(String nombre, String apellido, String DNI) {
		this.nombre = nombre;
		this.apellido = apellido;
		this.DNI = DNI;
	}

	public String getNombre() {
		return nombre;
	}

	public void setNombre(String nombre) {
		this.nombre = nombre;
	}

	public String getApellido() {
		return apellido;
	}

	public void setApellido(String apellido) {
		this.apellido = apellido;
	}

	public String getDNI() {
		return DNI;
	}

	public void setDNI(String dNI) {
		DNI = dNI;
	}

	public String getTipoUsuario() {
		return tipoUsuario;
	}

	public void setTipoUsuario(String tipoUsuario) {
		this.tipoUsuario = tipoUsuario;
	}

	public List<Busqueda> getBusquedas() {
		return busquedas;
	}

	public void setBusquedas(List<Busqueda> busquedas) {
		this.busquedas = busquedas;
	}

	public Perfil getPerfil() {
		return perfil;
	}

	public void setPerfil(Perfil perfil) {
		this.perfil = perfil;
	}

	public Double getMontoCompras() {
		return montoCompras;
	}

	public void setMontoCompras(Double montoCompras) {
		this.montoCompras = montoCompras;
	}

	public List<Asiento> getAsientosBusqueda() {
		return asientosBusqueda;
	}

	public void setAsientosBusqueda(List<Asiento> asientosBusqueda) {
		this.asientosBusqueda = asientosBusqueda;
	}

	public Boolean getRegistroBusqueda() {
		return registroBusqueda;
	}

	public void setRegistroBusqueda(Boolean registroBusqueda) {
		this.registroBusqueda = registroBusqueda;
	}
	
	public double montoRecargo() {
		return this.getPerfil().montoRecargo();
	}

	public ObtenerAsientos getObtencionDeAsientos() {
		return obtencionDeAsientos;
	}

	public void setObtencionDeAsientos(ObtenerAsientos obtencionDeAsientos) {
		this.obtencionDeAsientos = obtencionDeAsientos;
	}

	/**
	 * Metodo que se encarga de obtener los viajes posibles para el usuario
	 * @param origen
	 * @param fechaSalida
	 * @param horaSalida
	 * @param destino
	 * @param fechaLlegada
	 * @param horaLlegada
	 * @throws ConversionException 
	 */
	
	public void obtenerPosiblesViajes(String origen, String destino, 
			String fechaSalida, String horaSalida, 
			String fechaLlegada, String horaLlegada) throws ConversionException {
		
		Viaje viajeDeseado = new Viaje(origen,fechaSalida,horaSalida,
				destino,fechaLlegada,horaLlegada);
		
		if (!this.getRegistroBusqueda()){
			this.agregarHistorialBusqueda(viajeDeseado);
		}
		this.setAsientosBusqueda(obtencionDeAsientos.obtenerAsientos(viajeDeseado,this));
		
		for (int cantAsientosTotales = 0;cantAsientosTotales < this.getAsientosBusqueda().size();cantAsientosTotales++){		
			Asiento asientoTmp = this.getAsientosBusqueda().get(cantAsientosTotales);
			System.out.println("--"+cantAsientosTotales+"--"+"Clase: "+asientoTmp.getClaseAsiento()+
					" Ubicacion: "+asientoTmp.getUbicacionAsiento()+
					" precio asiento total: "+asientoTmp.getPrecioTotal());
		}
		
		this.obtencionDeAsientos.setCondicionBusquedaAsiento(true);
		this.setRegistroBusqueda(false);
		
		return ;
	}
	
	/**
	 * Metodo que reusa el metodo obtenerPosiblesViajes anterior, pero en este se pueden setear las companias que uno
	 * quiere en las que busque
	 * 
	 * @param origen
	 * @param fechaSalida
	 * @param horaSalida
	 * @param destino
	 * @param fechaLlegada
	 * @param horaLlegada
	 * @param companias
	 * @throws ConversionException 
	 */
	public void obtenerPosiblesViajes(String origen, String fechaSalida,
			String horaSalida, String destino, 
			String fechaLlegada, String horaLlegada,List<Compania> companias) throws ConversionException {
		this.obtencionDeAsientos.setCompanias(companias);
		this.obtencionDeAsientos.setCondicionBusquedaAsiento(false);
		this.obtenerPosiblesViajes(origen, fechaSalida, horaSalida, destino, fechaLlegada, horaLlegada);
	}
	
	/**
	 * Metodo parecido a los anteriores, pero en este caso recibe las caracteristicas de un viaje ya buscado
	 * de antemano
	 * @param viaje
	 * @param companias
	 * @throws ConversionException 
	 */
	public void obtenerPosiblesViajes(Viaje viaje,List<Compania> companias) throws ConversionException{
		this.setRegistroBusqueda(true);
		this.obtenerPosiblesViajes(viaje.getOrigen(), viaje.getFechaSalida(), 
				viaje.getHoraSalida(), viaje.getDestino(), viaje.getFechaLlegada(),
				viaje.getHoraLlegada(),companias);
	}
	
	
	/**
	 * Metodo que se encagar de guardar el historial de busqueda
	 * @param viaje
	 */
	private void agregarHistorialBusqueda(Viaje viaje){
		this.getBusquedas().add(new Busqueda(viaje));
	}
	
	/**
	 * Metodo utilizado para la compra del pasaje
	 * @param numeroDeOrdenDeListaDeBusqueda
	 */
	public void comprarAsiento(Integer numeroDeOrdenDeListaDeBusqueda){
		Asiento asientoAComprar = this.getAsientosBusqueda().get(numeroDeOrdenDeListaDeBusqueda);
		asientoAComprar.getCompania().comprar(asientoAComprar.getCodigoAsiento());
		this.montoCompras+=Double.parseDouble(asientoAComprar.getPrecioTotal());
	}
	
	/**
	 * Metodo utilizado para la reserva de un viaje
	 * @param numeroDeOrdenDeListaDeBusqueda
	 */
	public void reservarAsiento(Integer numeroDeOrdenDeListaDeBusqueda){
		Asiento asientoAReservar = this.getAsientosBusqueda().get(numeroDeOrdenDeListaDeBusqueda);
		asientoAReservar.getCompania().reservar(asientoAReservar.getCodigoAsiento(),this.getDNI());
		this.montoCompras+=Double.parseDouble(asientoAReservar.getPrecioTotal());
	}
}
